/**
 * @file		dd_pmc_gpio.c
 * @brief		PMC GPIO driver
 * @note		None
 * @attention	None
 * 
 * <B><I>Copyright 2016 Socionext Inc.</I></B>
 */

#include "pmc.h"
#include "dd_pmc_gpio.h"
#include "dd_arm.h"
#include "dd_top.h"
#include <string.h>

/*----------------------------------------------------------------------*/
/* Definition															*/
/*----------------------------------------------------------------------*/
// GPIO Register 
#define D_DD_PMC_GPIO_REG_DATA_SIZE				(96)

/*----------------------------------------------------------------------*/
/* Enumeration															*/
/*----------------------------------------------------------------------*/
/* Nothing Special */

/*----------------------------------------------------------------------*/
/* Structure															*/
/*----------------------------------------------------------------------*/
/* Nothing Special */

/*----------------------------------------------------------------------*/
/* Global Data															*/
/*----------------------------------------------------------------------*/
/* Nothing Special */

/*----------------------------------------------------------------------*/
/* Macro																*/
/*----------------------------------------------------------------------*/
#ifdef CO_ACT_PCLOCK
#define CO_ACT_GPIO_CLOCK_CONTROL
#endif //CO_ACT_PCLOCK

#define Dd_PMC_GPIO_Set_CLKSTOP_GPIOAP(a)		Dd_Top_Set_CLKSTOP1_GPIOAP(a);

#ifdef CO_ACT_GPIO_CLOCK_CONTROL
#define Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI()	{Dd_ARM_Critical_Section_Start();Dd_PMC_GPIO_Set_CLKSTOP_GPIOAP(0);(void)IO_PMC.GPIO.PDR.PDR10.bit.PDR0;Dd_ARM_Dsb_Pou();}
#define Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI()		{Dd_PMC_GPIO_Set_CLKSTOP_GPIOAP(1);Dd_ARM_Critical_Section_End();}
#else
#define Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI()
#define Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI()
#endif // CO_ACT_GPIO_CLOCK_CONTROL

/*----------------------------------------------------------------------*/
/* Local Method Definition												*/
/*----------------------------------------------------------------------*/
/* Nothing Special */

/*----------------------------------------------------------------------*/
/* Local Function														*/
/*----------------------------------------------------------------------*/
/* Nothing Special */

/*----------------------------------------------------------------------*/
/* Global Function														*/
/*----------------------------------------------------------------------*/
/**
Set the functionality of a selectable GPIO port.<br>
It is set to the EPCR(External Port Control Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [in]  function	Function type.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_FUNC_GPIO
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_FUNC_HWMODE
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Input parameter error.
*/
INT32 Dd_PMC_GPIO_Set_Gpio_Function( E_DD_PMC_GPIO_PORT port, UCHAR function )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL
	
#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Function() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( function > D_DD_PMC_GPIO_GPIO_FUNC_HWMODE ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Function() error. function parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();
	
	switch( port ) {
		case E_DD_PMC_GPIO_P22: IO_PMC.GPIO.EPCR.bit.P22 = function; break;
		case E_DD_PMC_GPIO_P23: IO_PMC.GPIO.EPCR.bit.P23 = function; break;
		case E_DD_PMC_GPIO_P31: IO_PMC.GPIO.EPCR.bit.P31 = function; break;
		case E_DD_PMC_GPIO_P33: IO_PMC.GPIO.EPCR.bit.P33 = function; break;
		case E_DD_PMC_GPIO_P35: IO_PMC.GPIO.EPCR.bit.P35 = function; break;
		case E_DD_PMC_GPIO_P37: IO_PMC.GPIO.EPCR.bit.P37 = function; break;
		case E_DD_PMC_GPIO_P45: IO_PMC.GPIO.EPCR.bit.P45 = function; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Set_Gpio_Function() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_ARM_Dsb_Pou();
	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Get the functionality of a selectable GPIO port.<br>
It is get from the EPCR(External Port Control Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [out] function	Function type.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_FUNC_GPIO
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_FUNC_HWMODE
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Input parameter error.
*/
INT32 Dd_PMC_GPIO_Get_Gpio_Function( E_DD_PMC_GPIO_PORT port, UCHAR* function )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Function() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( function == NULL ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Function() error. function parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P22: *function = IO_PMC.GPIO.EPCR.bit.P22; break;
		case E_DD_PMC_GPIO_P23: *function = IO_PMC.GPIO.EPCR.bit.P23; break;
		case E_DD_PMC_GPIO_P31: *function = IO_PMC.GPIO.EPCR.bit.P31; break;
		case E_DD_PMC_GPIO_P33: *function = IO_PMC.GPIO.EPCR.bit.P33; break;
		case E_DD_PMC_GPIO_P35: *function = IO_PMC.GPIO.EPCR.bit.P35; break;
		case E_DD_PMC_GPIO_P37: *function = IO_PMC.GPIO.EPCR.bit.P37; break;
		case E_DD_PMC_GPIO_P45: *function = IO_PMC.GPIO.EPCR.bit.P45; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Get_Gpio_Function() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Set the direction of a selectable GPIO port.<br>
It is set to the DDR(Data Direction Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [in]  direction	Direction type.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_DIR_IN
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_DIR_OUT
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Set_Gpio_Direction( E_DD_PMC_GPIO_PORT port, UCHAR direction )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Direction() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( direction > D_DD_PMC_GPIO_GPIO_DIR_OUT ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Direction() error. direction parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();
	
	switch( port ) {
		case E_DD_PMC_GPIO_P00: IO_PMC.GPIO.DDR.bit.P00 = direction; break;
		case E_DD_PMC_GPIO_P01: IO_PMC.GPIO.DDR.bit.P01 = direction; break;
		case E_DD_PMC_GPIO_P02: IO_PMC.GPIO.DDR.bit.P02 = direction; break;
		case E_DD_PMC_GPIO_P03: IO_PMC.GPIO.DDR.bit.P03 = direction; break;
		case E_DD_PMC_GPIO_P04: IO_PMC.GPIO.DDR.bit.P04 = direction; break;
		case E_DD_PMC_GPIO_P05: IO_PMC.GPIO.DDR.bit.P05 = direction; break;
		case E_DD_PMC_GPIO_P06: IO_PMC.GPIO.DDR.bit.P06 = direction; break;
		case E_DD_PMC_GPIO_P07: IO_PMC.GPIO.DDR.bit.P07 = direction; break;
		case E_DD_PMC_GPIO_P10: IO_PMC.GPIO.DDR.bit.P10 = direction; break;
		case E_DD_PMC_GPIO_P11: IO_PMC.GPIO.DDR.bit.P11 = direction; break;
		case E_DD_PMC_GPIO_P12: IO_PMC.GPIO.DDR.bit.P12 = direction; break;
		case E_DD_PMC_GPIO_P13: IO_PMC.GPIO.DDR.bit.P13 = direction; break;
		case E_DD_PMC_GPIO_P14: IO_PMC.GPIO.DDR.bit.P14 = direction; break;
		case E_DD_PMC_GPIO_P15: IO_PMC.GPIO.DDR.bit.P15 = direction; break;
		case E_DD_PMC_GPIO_P16: IO_PMC.GPIO.DDR.bit.P16 = direction; break;
		case E_DD_PMC_GPIO_P17: IO_PMC.GPIO.DDR.bit.P17 = direction; break;
		case E_DD_PMC_GPIO_P20: IO_PMC.GPIO.DDR.bit.P20 = direction; break;
		case E_DD_PMC_GPIO_P21: IO_PMC.GPIO.DDR.bit.P21 = direction; break;
		case E_DD_PMC_GPIO_P22: IO_PMC.GPIO.DDR.bit.P22 = direction; break;
		case E_DD_PMC_GPIO_P23: IO_PMC.GPIO.DDR.bit.P23 = direction; break;
		case E_DD_PMC_GPIO_P24: IO_PMC.GPIO.DDR.bit.P24 = direction; break;
		case E_DD_PMC_GPIO_P25: IO_PMC.GPIO.DDR.bit.P25 = direction; break;
		case E_DD_PMC_GPIO_P26: IO_PMC.GPIO.DDR.bit.P26 = direction; break;
		case E_DD_PMC_GPIO_P27: IO_PMC.GPIO.DDR.bit.P27 = direction; break;
		case E_DD_PMC_GPIO_P30: IO_PMC.GPIO.DDR.bit.P30 = direction; break;
		case E_DD_PMC_GPIO_P31: IO_PMC.GPIO.DDR.bit.P31 = direction; break;
		case E_DD_PMC_GPIO_P32: IO_PMC.GPIO.DDR.bit.P32 = direction; break;
		case E_DD_PMC_GPIO_P33: IO_PMC.GPIO.DDR.bit.P33 = direction; break;
		case E_DD_PMC_GPIO_P34: IO_PMC.GPIO.DDR.bit.P34 = direction; break;
		case E_DD_PMC_GPIO_P35: IO_PMC.GPIO.DDR.bit.P35 = direction; break;
		case E_DD_PMC_GPIO_P36: IO_PMC.GPIO.DDR.bit.P36 = direction; break;
		case E_DD_PMC_GPIO_P37: IO_PMC.GPIO.DDR.bit.P37 = direction; break;
		case E_DD_PMC_GPIO_P44: IO_PMC.GPIO.DDR.bit.P44 = direction; break;
		case E_DD_PMC_GPIO_P45: IO_PMC.GPIO.DDR.bit.P45 = direction; break;
		case E_DD_PMC_GPIO_P46: IO_PMC.GPIO.DDR.bit.P46 = direction; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Set_Gpio_Direction() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	
	Dd_ARM_Dsb_Pou();
	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Get the direction of a selectable GPIO port.<br>
It is get from the DDR(Data Direction Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [out] direction	Direction type.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_DIR_IN
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_DIR_OUT
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Get_Gpio_Direction( E_DD_PMC_GPIO_PORT port, UCHAR* direction )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Direction() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( direction == NULL ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Direction() error. direction parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: *direction = IO_PMC.GPIO.DDR.bit.P00; break;
		case E_DD_PMC_GPIO_P01: *direction = IO_PMC.GPIO.DDR.bit.P01; break;
		case E_DD_PMC_GPIO_P02: *direction = IO_PMC.GPIO.DDR.bit.P02; break;
		case E_DD_PMC_GPIO_P03: *direction = IO_PMC.GPIO.DDR.bit.P03; break;
		case E_DD_PMC_GPIO_P04: *direction = IO_PMC.GPIO.DDR.bit.P04; break;
		case E_DD_PMC_GPIO_P05: *direction = IO_PMC.GPIO.DDR.bit.P05; break;
		case E_DD_PMC_GPIO_P06: *direction = IO_PMC.GPIO.DDR.bit.P06; break;
		case E_DD_PMC_GPIO_P07: *direction = IO_PMC.GPIO.DDR.bit.P07; break;
		case E_DD_PMC_GPIO_P10: *direction = IO_PMC.GPIO.DDR.bit.P10; break;
		case E_DD_PMC_GPIO_P11: *direction = IO_PMC.GPIO.DDR.bit.P11; break;
		case E_DD_PMC_GPIO_P12: *direction = IO_PMC.GPIO.DDR.bit.P12; break;
		case E_DD_PMC_GPIO_P13: *direction = IO_PMC.GPIO.DDR.bit.P13; break;
		case E_DD_PMC_GPIO_P14: *direction = IO_PMC.GPIO.DDR.bit.P14; break;
		case E_DD_PMC_GPIO_P15: *direction = IO_PMC.GPIO.DDR.bit.P15; break;
		case E_DD_PMC_GPIO_P16: *direction = IO_PMC.GPIO.DDR.bit.P16; break;
		case E_DD_PMC_GPIO_P17: *direction = IO_PMC.GPIO.DDR.bit.P17; break;
		case E_DD_PMC_GPIO_P20: *direction = IO_PMC.GPIO.DDR.bit.P20; break;
		case E_DD_PMC_GPIO_P21: *direction = IO_PMC.GPIO.DDR.bit.P21; break;
		case E_DD_PMC_GPIO_P22: *direction = IO_PMC.GPIO.DDR.bit.P22; break;
		case E_DD_PMC_GPIO_P23: *direction = IO_PMC.GPIO.DDR.bit.P23; break;
		case E_DD_PMC_GPIO_P24: *direction = IO_PMC.GPIO.DDR.bit.P24; break;
		case E_DD_PMC_GPIO_P25: *direction = IO_PMC.GPIO.DDR.bit.P25; break;
		case E_DD_PMC_GPIO_P26: *direction = IO_PMC.GPIO.DDR.bit.P26; break;
		case E_DD_PMC_GPIO_P27: *direction = IO_PMC.GPIO.DDR.bit.P27; break;
		case E_DD_PMC_GPIO_P30: *direction = IO_PMC.GPIO.DDR.bit.P30; break;
		case E_DD_PMC_GPIO_P31: *direction = IO_PMC.GPIO.DDR.bit.P31; break;
		case E_DD_PMC_GPIO_P32: *direction = IO_PMC.GPIO.DDR.bit.P32; break;
		case E_DD_PMC_GPIO_P33: *direction = IO_PMC.GPIO.DDR.bit.P33; break;
		case E_DD_PMC_GPIO_P34: *direction = IO_PMC.GPIO.DDR.bit.P34; break;
		case E_DD_PMC_GPIO_P35: *direction = IO_PMC.GPIO.DDR.bit.P35; break;
		case E_DD_PMC_GPIO_P36: *direction = IO_PMC.GPIO.DDR.bit.P36; break;
		case E_DD_PMC_GPIO_P37: *direction = IO_PMC.GPIO.DDR.bit.P37; break;
		case E_DD_PMC_GPIO_P44: *direction = IO_PMC.GPIO.DDR.bit.P44; break;
		case E_DD_PMC_GPIO_P45: *direction = IO_PMC.GPIO.DDR.bit.P45; break;
		case E_DD_PMC_GPIO_P46: *direction = IO_PMC.GPIO.DDR.bit.P46; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Get_Gpio_Direction() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Set the state of a selectable GPIO port.<br>
It is set to the PDR(Port Data Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [in]  status		Port status.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_STATUS_LOW
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_STATUS_HIGH
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Set_Gpio_Status( E_DD_PMC_GPIO_PORT port, UCHAR status )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL
	int						index = 0;
	union io_pmc_gpio_pdr	pdr;

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Status() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( status > D_DD_PMC_GPIO_GPIO_STATUS_HIGH ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Status() error. status parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif
	memset(&pdr, 0, sizeof(pdr));
	
	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: pdr.bit.P00 = status; pdr.bit.PWE00 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P01: pdr.bit.P01 = status; pdr.bit.PWE01 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P02: pdr.bit.P02 = status; pdr.bit.PWE02 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P03: pdr.bit.P03 = status; pdr.bit.PWE03 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P04: pdr.bit.P04 = status; pdr.bit.PWE04 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P05: pdr.bit.P05 = status; pdr.bit.PWE05 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P06: pdr.bit.P06 = status; pdr.bit.PWE06 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P07: pdr.bit.P07 = status; pdr.bit.PWE07 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P10: pdr.bit.P10 = status; pdr.bit.PWE10 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P11: pdr.bit.P11 = status; pdr.bit.PWE11 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P12: pdr.bit.P12 = status; pdr.bit.PWE12 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P13: pdr.bit.P13 = status; pdr.bit.PWE13 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P14: pdr.bit.P14 = status; pdr.bit.PWE14 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P15: pdr.bit.P15 = status; pdr.bit.PWE15 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P16: pdr.bit.P16 = status; pdr.bit.PWE16 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P17: pdr.bit.P17 = status; pdr.bit.PWE17 = 1; index = 0; break;
		case E_DD_PMC_GPIO_P20: pdr.bit.P20 = status; pdr.bit.PWE20 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P21: pdr.bit.P21 = status; pdr.bit.PWE21 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P22: pdr.bit.P22 = status; pdr.bit.PWE22 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P23: pdr.bit.P23 = status; pdr.bit.PWE23 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P24: pdr.bit.P24 = status; pdr.bit.PWE24 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P25: pdr.bit.P25 = status; pdr.bit.PWE25 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P26: pdr.bit.P26 = status; pdr.bit.PWE26 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P27: pdr.bit.P27 = status; pdr.bit.PWE27 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P30: pdr.bit.P30 = status; pdr.bit.PWE30 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P31: pdr.bit.P31 = status; pdr.bit.PWE31 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P32: pdr.bit.P32 = status; pdr.bit.PWE32 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P33: pdr.bit.P33 = status; pdr.bit.PWE33 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P34: pdr.bit.P34 = status; pdr.bit.PWE34 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P35: pdr.bit.P35 = status; pdr.bit.PWE35 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P36: pdr.bit.P36 = status; pdr.bit.PWE36 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P37: pdr.bit.P37 = status; pdr.bit.PWE37 = 1; index = 1; break;
		case E_DD_PMC_GPIO_P44: pdr.bit.P44 = status; pdr.bit.PWE44 = 1; index = 2; break;
		case E_DD_PMC_GPIO_P45: pdr.bit.P45 = status; pdr.bit.PWE45 = 1; index = 2; break;
		case E_DD_PMC_GPIO_P46: pdr.bit.P46 = status; pdr.bit.PWE46 = 1; index = 2; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Set_Gpio_Status() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	
	// Set PDR
	IO_PMC.GPIO.PDR.word[index] = pdr.word[index];

	Dd_ARM_Dsb_Pou();
	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Get the state of a selectable GPIO port.<br>
It is get from the PDR(Port Data Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [out] status		Port status.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_STATUS_LOW
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_STATUS_HIGH
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Get_Gpio_Status( E_DD_PMC_GPIO_PORT port, UCHAR* status )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Status() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( status == NULL ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Status() error. status parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: *status = IO_PMC.GPIO.PDR.bit.P00; break;
		case E_DD_PMC_GPIO_P01: *status = IO_PMC.GPIO.PDR.bit.P01; break;
		case E_DD_PMC_GPIO_P02: *status = IO_PMC.GPIO.PDR.bit.P02; break;
		case E_DD_PMC_GPIO_P03: *status = IO_PMC.GPIO.PDR.bit.P03; break;
		case E_DD_PMC_GPIO_P04: *status = IO_PMC.GPIO.PDR.bit.P04; break;
		case E_DD_PMC_GPIO_P05: *status = IO_PMC.GPIO.PDR.bit.P05; break;
		case E_DD_PMC_GPIO_P06: *status = IO_PMC.GPIO.PDR.bit.P06; break;
		case E_DD_PMC_GPIO_P07: *status = IO_PMC.GPIO.PDR.bit.P07; break;
		case E_DD_PMC_GPIO_P10: *status = IO_PMC.GPIO.PDR.bit.P10; break;
		case E_DD_PMC_GPIO_P11: *status = IO_PMC.GPIO.PDR.bit.P11; break;
		case E_DD_PMC_GPIO_P12: *status = IO_PMC.GPIO.PDR.bit.P12; break;
		case E_DD_PMC_GPIO_P13: *status = IO_PMC.GPIO.PDR.bit.P13; break;
		case E_DD_PMC_GPIO_P14: *status = IO_PMC.GPIO.PDR.bit.P14; break;
		case E_DD_PMC_GPIO_P15: *status = IO_PMC.GPIO.PDR.bit.P15; break;
		case E_DD_PMC_GPIO_P16: *status = IO_PMC.GPIO.PDR.bit.P16; break;
		case E_DD_PMC_GPIO_P17: *status = IO_PMC.GPIO.PDR.bit.P17; break;
		case E_DD_PMC_GPIO_P20: *status = IO_PMC.GPIO.PDR.bit.P20; break;
		case E_DD_PMC_GPIO_P21: *status = IO_PMC.GPIO.PDR.bit.P21; break;
		case E_DD_PMC_GPIO_P22: *status = IO_PMC.GPIO.PDR.bit.P22; break;
		case E_DD_PMC_GPIO_P23: *status = IO_PMC.GPIO.PDR.bit.P23; break;
		case E_DD_PMC_GPIO_P24: *status = IO_PMC.GPIO.PDR.bit.P24; break;
		case E_DD_PMC_GPIO_P25: *status = IO_PMC.GPIO.PDR.bit.P25; break;
		case E_DD_PMC_GPIO_P26: *status = IO_PMC.GPIO.PDR.bit.P26; break;
		case E_DD_PMC_GPIO_P27: *status = IO_PMC.GPIO.PDR.bit.P27; break;
		case E_DD_PMC_GPIO_P30: *status = IO_PMC.GPIO.PDR.bit.P30; break;
		case E_DD_PMC_GPIO_P31: *status = IO_PMC.GPIO.PDR.bit.P31; break;
		case E_DD_PMC_GPIO_P32: *status = IO_PMC.GPIO.PDR.bit.P32; break;
		case E_DD_PMC_GPIO_P33: *status = IO_PMC.GPIO.PDR.bit.P33; break;
		case E_DD_PMC_GPIO_P34: *status = IO_PMC.GPIO.PDR.bit.P34; break;
		case E_DD_PMC_GPIO_P35: *status = IO_PMC.GPIO.PDR.bit.P35; break;
		case E_DD_PMC_GPIO_P36: *status = IO_PMC.GPIO.PDR.bit.P36; break;
		case E_DD_PMC_GPIO_P37: *status = IO_PMC.GPIO.PDR.bit.P37; break;
		case E_DD_PMC_GPIO_P44: *status = IO_PMC.GPIO.PDR.bit.P44; break;
		case E_DD_PMC_GPIO_P45: *status = IO_PMC.GPIO.PDR.bit.P45; break;
		case E_DD_PMC_GPIO_P46: *status = IO_PMC.GPIO.PDR.bit.P46; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Get_Gpio_Status() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Set the Pull-up/down enable state of a selectable GPIO port.<br>
It is set to the PUDER(Pull-up/down Enable Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [in]  enable		Pull-up/down enable state.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_PUD_OFF
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_PUD_ON
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Enable( E_DD_PMC_GPIO_PORT port, UCHAR enable )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Enable() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( enable > D_DD_PMC_GPIO_GPIO_PUD_ON ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Enable() error. enable parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: IO_PMC.GPIO.PUDER.bit.P00 = enable; break;
		case E_DD_PMC_GPIO_P01: IO_PMC.GPIO.PUDER.bit.P01 = enable; break;
		case E_DD_PMC_GPIO_P02: IO_PMC.GPIO.PUDER.bit.P02 = enable; break;
		case E_DD_PMC_GPIO_P03: IO_PMC.GPIO.PUDER.bit.P03 = enable; break;
		case E_DD_PMC_GPIO_P04: IO_PMC.GPIO.PUDER.bit.P04 = enable; break;
		case E_DD_PMC_GPIO_P05: IO_PMC.GPIO.PUDER.bit.P05 = enable; break;
		case E_DD_PMC_GPIO_P06: IO_PMC.GPIO.PUDER.bit.P06 = enable; break;
		case E_DD_PMC_GPIO_P07: IO_PMC.GPIO.PUDER.bit.P07 = enable; break;
		case E_DD_PMC_GPIO_P10: IO_PMC.GPIO.PUDER.bit.P10 = enable; break;
		case E_DD_PMC_GPIO_P11: IO_PMC.GPIO.PUDER.bit.P11 = enable; break;
		case E_DD_PMC_GPIO_P12: IO_PMC.GPIO.PUDER.bit.P12 = enable; break;
		case E_DD_PMC_GPIO_P13: IO_PMC.GPIO.PUDER.bit.P13 = enable; break;
		case E_DD_PMC_GPIO_P14: IO_PMC.GPIO.PUDER.bit.P14 = enable; break;
		case E_DD_PMC_GPIO_P15: IO_PMC.GPIO.PUDER.bit.P15 = enable; break;
		case E_DD_PMC_GPIO_P16: IO_PMC.GPIO.PUDER.bit.P16 = enable; break;
		case E_DD_PMC_GPIO_P17: IO_PMC.GPIO.PUDER.bit.P17 = enable; break;
		case E_DD_PMC_GPIO_P20: IO_PMC.GPIO.PUDER.bit.P20 = enable; break;
		case E_DD_PMC_GPIO_P21: IO_PMC.GPIO.PUDER.bit.P21 = enable; break;
		case E_DD_PMC_GPIO_P22: IO_PMC.GPIO.PUDER.bit.P22 = enable; break;
		case E_DD_PMC_GPIO_P23: IO_PMC.GPIO.PUDER.bit.P23 = enable; break;
		case E_DD_PMC_GPIO_P24: IO_PMC.GPIO.PUDER.bit.P24 = enable; break;
		case E_DD_PMC_GPIO_P25: IO_PMC.GPIO.PUDER.bit.P25 = enable; break;
		case E_DD_PMC_GPIO_P26: IO_PMC.GPIO.PUDER.bit.P26 = enable; break;
		case E_DD_PMC_GPIO_P27: IO_PMC.GPIO.PUDER.bit.P27 = enable; break;
		case E_DD_PMC_GPIO_P30: IO_PMC.GPIO.PUDER.bit.P30 = enable; break;
		case E_DD_PMC_GPIO_P31: IO_PMC.GPIO.PUDER.bit.P31 = enable; break;
		case E_DD_PMC_GPIO_P32: IO_PMC.GPIO.PUDER.bit.P32 = enable; break;
		case E_DD_PMC_GPIO_P33: IO_PMC.GPIO.PUDER.bit.P33 = enable; break;
		case E_DD_PMC_GPIO_P34: IO_PMC.GPIO.PUDER.bit.P34 = enable; break;
		case E_DD_PMC_GPIO_P35: IO_PMC.GPIO.PUDER.bit.P35 = enable; break;
		case E_DD_PMC_GPIO_P36: IO_PMC.GPIO.PUDER.bit.P36 = enable; break;
		case E_DD_PMC_GPIO_P37: IO_PMC.GPIO.PUDER.bit.P37 = enable; break;
		case E_DD_PMC_GPIO_P44: IO_PMC.GPIO.PUDER.bit.P44 = enable; break;
		case E_DD_PMC_GPIO_P45: IO_PMC.GPIO.PUDER.bit.P45 = enable; break;
		case E_DD_PMC_GPIO_P46: IO_PMC.GPIO.PUDER.bit.P46 = enable; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Enable() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	
	Dd_ARM_Dsb_Pou();
	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Get the Pull-up/down enable state of a selectable GPIO port.<br>
It is get from the PUDER(Pull-up/down Enable Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [out] enable		Pull-up/down enable state.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_PUD_OFF
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_PUD_ON
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Enable( E_DD_PMC_GPIO_PORT port, UCHAR* enable )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Enable() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( enable == NULL ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Enable() error. enable parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: *enable = IO_PMC.GPIO.PUDER.bit.P00; break;
		case E_DD_PMC_GPIO_P01: *enable = IO_PMC.GPIO.PUDER.bit.P01; break;
		case E_DD_PMC_GPIO_P02: *enable = IO_PMC.GPIO.PUDER.bit.P02; break;
		case E_DD_PMC_GPIO_P03: *enable = IO_PMC.GPIO.PUDER.bit.P03; break;
		case E_DD_PMC_GPIO_P04: *enable = IO_PMC.GPIO.PUDER.bit.P04; break;
		case E_DD_PMC_GPIO_P05: *enable = IO_PMC.GPIO.PUDER.bit.P05; break;
		case E_DD_PMC_GPIO_P06: *enable = IO_PMC.GPIO.PUDER.bit.P06; break;
		case E_DD_PMC_GPIO_P07: *enable = IO_PMC.GPIO.PUDER.bit.P07; break;
		case E_DD_PMC_GPIO_P10: *enable = IO_PMC.GPIO.PUDER.bit.P10; break;
		case E_DD_PMC_GPIO_P11: *enable = IO_PMC.GPIO.PUDER.bit.P11; break;
		case E_DD_PMC_GPIO_P12: *enable = IO_PMC.GPIO.PUDER.bit.P12; break;
		case E_DD_PMC_GPIO_P13: *enable = IO_PMC.GPIO.PUDER.bit.P13; break;
		case E_DD_PMC_GPIO_P14: *enable = IO_PMC.GPIO.PUDER.bit.P14; break;
		case E_DD_PMC_GPIO_P15: *enable = IO_PMC.GPIO.PUDER.bit.P15; break;
		case E_DD_PMC_GPIO_P16: *enable = IO_PMC.GPIO.PUDER.bit.P16; break;
		case E_DD_PMC_GPIO_P17: *enable = IO_PMC.GPIO.PUDER.bit.P17; break;
		case E_DD_PMC_GPIO_P20: *enable = IO_PMC.GPIO.PUDER.bit.P20; break;
		case E_DD_PMC_GPIO_P21: *enable = IO_PMC.GPIO.PUDER.bit.P21; break;
		case E_DD_PMC_GPIO_P22: *enable = IO_PMC.GPIO.PUDER.bit.P22; break;
		case E_DD_PMC_GPIO_P23: *enable = IO_PMC.GPIO.PUDER.bit.P23; break;
		case E_DD_PMC_GPIO_P24: *enable = IO_PMC.GPIO.PUDER.bit.P24; break;
		case E_DD_PMC_GPIO_P25: *enable = IO_PMC.GPIO.PUDER.bit.P25; break;
		case E_DD_PMC_GPIO_P26: *enable = IO_PMC.GPIO.PUDER.bit.P26; break;
		case E_DD_PMC_GPIO_P27: *enable = IO_PMC.GPIO.PUDER.bit.P27; break;
		case E_DD_PMC_GPIO_P30: *enable = IO_PMC.GPIO.PUDER.bit.P30; break;
		case E_DD_PMC_GPIO_P31: *enable = IO_PMC.GPIO.PUDER.bit.P31; break;
		case E_DD_PMC_GPIO_P32: *enable = IO_PMC.GPIO.PUDER.bit.P32; break;
		case E_DD_PMC_GPIO_P33: *enable = IO_PMC.GPIO.PUDER.bit.P33; break;
		case E_DD_PMC_GPIO_P34: *enable = IO_PMC.GPIO.PUDER.bit.P34; break;
		case E_DD_PMC_GPIO_P35: *enable = IO_PMC.GPIO.PUDER.bit.P35; break;
		case E_DD_PMC_GPIO_P36: *enable = IO_PMC.GPIO.PUDER.bit.P36; break;
		case E_DD_PMC_GPIO_P37: *enable = IO_PMC.GPIO.PUDER.bit.P37; break;
		case E_DD_PMC_GPIO_P44: *enable = IO_PMC.GPIO.PUDER.bit.P44; break;
		case E_DD_PMC_GPIO_P45: *enable = IO_PMC.GPIO.PUDER.bit.P45; break;
		case E_DD_PMC_GPIO_P46: *enable = IO_PMC.GPIO.PUDER.bit.P46; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Enable() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Set the Pull-up/down state of a selectable GPIO port.<br>
It is set to the PUDCR(Pull-up/down Control Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [in]  control	Pull-up/down state.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_PUD_DOWN
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_PUD_UP
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Ctrl( E_DD_PMC_GPIO_PORT port, UCHAR control )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Ctrl() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( control > D_DD_PMC_GPIO_GPIO_PUD_UP ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Ctrl() error. control parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: IO_PMC.GPIO.PUDCR.bit.P00 = control; break;
		case E_DD_PMC_GPIO_P01: IO_PMC.GPIO.PUDCR.bit.P01 = control; break;
		case E_DD_PMC_GPIO_P02: IO_PMC.GPIO.PUDCR.bit.P02 = control; break;
		case E_DD_PMC_GPIO_P03: IO_PMC.GPIO.PUDCR.bit.P03 = control; break;
		case E_DD_PMC_GPIO_P04: IO_PMC.GPIO.PUDCR.bit.P04 = control; break;
		case E_DD_PMC_GPIO_P05: IO_PMC.GPIO.PUDCR.bit.P05 = control; break;
		case E_DD_PMC_GPIO_P06: IO_PMC.GPIO.PUDCR.bit.P06 = control; break;
		case E_DD_PMC_GPIO_P07: IO_PMC.GPIO.PUDCR.bit.P07 = control; break;
		case E_DD_PMC_GPIO_P10: IO_PMC.GPIO.PUDCR.bit.P10 = control; break;
		case E_DD_PMC_GPIO_P11: IO_PMC.GPIO.PUDCR.bit.P11 = control; break;
		case E_DD_PMC_GPIO_P12: IO_PMC.GPIO.PUDCR.bit.P12 = control; break;
		case E_DD_PMC_GPIO_P13: IO_PMC.GPIO.PUDCR.bit.P13 = control; break;
		case E_DD_PMC_GPIO_P14: IO_PMC.GPIO.PUDCR.bit.P14 = control; break;
		case E_DD_PMC_GPIO_P15: IO_PMC.GPIO.PUDCR.bit.P15 = control; break;
		case E_DD_PMC_GPIO_P16: IO_PMC.GPIO.PUDCR.bit.P16 = control; break;
		case E_DD_PMC_GPIO_P17: IO_PMC.GPIO.PUDCR.bit.P17 = control; break;
		case E_DD_PMC_GPIO_P20: IO_PMC.GPIO.PUDCR.bit.P20 = control; break;
		case E_DD_PMC_GPIO_P21: IO_PMC.GPIO.PUDCR.bit.P21 = control; break;
		case E_DD_PMC_GPIO_P22: IO_PMC.GPIO.PUDCR.bit.P22 = control; break;
		case E_DD_PMC_GPIO_P23: IO_PMC.GPIO.PUDCR.bit.P23 = control; break;
		case E_DD_PMC_GPIO_P24: IO_PMC.GPIO.PUDCR.bit.P24 = control; break;
		case E_DD_PMC_GPIO_P25: IO_PMC.GPIO.PUDCR.bit.P25 = control; break;
		case E_DD_PMC_GPIO_P26: IO_PMC.GPIO.PUDCR.bit.P26 = control; break;
		case E_DD_PMC_GPIO_P27: IO_PMC.GPIO.PUDCR.bit.P27 = control; break;
		case E_DD_PMC_GPIO_P30: IO_PMC.GPIO.PUDCR.bit.P30 = control; break;
		case E_DD_PMC_GPIO_P31: IO_PMC.GPIO.PUDCR.bit.P31 = control; break;
		case E_DD_PMC_GPIO_P32: IO_PMC.GPIO.PUDCR.bit.P32 = control; break;
		case E_DD_PMC_GPIO_P33: IO_PMC.GPIO.PUDCR.bit.P33 = control; break;
		case E_DD_PMC_GPIO_P34: IO_PMC.GPIO.PUDCR.bit.P34 = control; break;
		case E_DD_PMC_GPIO_P35: IO_PMC.GPIO.PUDCR.bit.P35 = control; break;
		case E_DD_PMC_GPIO_P36: IO_PMC.GPIO.PUDCR.bit.P36 = control; break;
		case E_DD_PMC_GPIO_P37: IO_PMC.GPIO.PUDCR.bit.P37 = control; break;
		case E_DD_PMC_GPIO_P44: IO_PMC.GPIO.PUDCR.bit.P44 = control; break;
		case E_DD_PMC_GPIO_P45: IO_PMC.GPIO.PUDCR.bit.P45 = control; break;
		case E_DD_PMC_GPIO_P46: IO_PMC.GPIO.PUDCR.bit.P46 = control; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Set_Gpio_Pull_Up_Down_Ctrl() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	
	Dd_ARM_Dsb_Pou();
	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

/**
Get the Pull-up/down state of a selectable GPIO port.<br>
It is get from the PUDCR(Pull-up/down Control Register) value.
@param [in]  port		Port name. See @ref E_DD_PMC_GPIO_PORT
@param [out] control	Pull-up/down state.
						  <ul>
							  <li>0:@ref D_DD_PMC_GPIO_GPIO_PUD_DOWN
							  <li>1:@ref D_DD_PMC_GPIO_GPIO_PUD_UP
						  </ul>
@retval D_DDIM_OK					Success.
@retval D_DD_PMC_GPIO_INPUT_PARAM_ERROR	Error occurred.
*/
INT32 Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Ctrl( E_DD_PMC_GPIO_PORT port, UCHAR* control )
{
#ifdef CO_ACT_GPIO_CLOCK_CONTROL
	INT32 s;
#endif // CO_ACT_GPIO_CLOCK_CONTROL

#ifdef CO_PARAM_CHECK
	if( port >= E_DD_PMC_GPIO_PORT_MAX ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Ctrl() error. port parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
	if( control == NULL ) {
		Ddim_Assertion(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Ctrl() error. control parameters is abnormal.\n"));
		return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}
#endif

	Dd_PMC_GPIO_Start_GPIO_CLK_WITH_DI();

	switch( port ) {
		case E_DD_PMC_GPIO_P00: *control = IO_PMC.GPIO.PUDCR.bit.P00; break;
		case E_DD_PMC_GPIO_P01: *control = IO_PMC.GPIO.PUDCR.bit.P01; break;
		case E_DD_PMC_GPIO_P02: *control = IO_PMC.GPIO.PUDCR.bit.P02; break;
		case E_DD_PMC_GPIO_P03: *control = IO_PMC.GPIO.PUDCR.bit.P03; break;
		case E_DD_PMC_GPIO_P04: *control = IO_PMC.GPIO.PUDCR.bit.P04; break;
		case E_DD_PMC_GPIO_P05: *control = IO_PMC.GPIO.PUDCR.bit.P05; break;
		case E_DD_PMC_GPIO_P06: *control = IO_PMC.GPIO.PUDCR.bit.P06; break;
		case E_DD_PMC_GPIO_P07: *control = IO_PMC.GPIO.PUDCR.bit.P07; break;
		case E_DD_PMC_GPIO_P10: *control = IO_PMC.GPIO.PUDCR.bit.P10; break;
		case E_DD_PMC_GPIO_P11: *control = IO_PMC.GPIO.PUDCR.bit.P11; break;
		case E_DD_PMC_GPIO_P12: *control = IO_PMC.GPIO.PUDCR.bit.P12; break;
		case E_DD_PMC_GPIO_P13: *control = IO_PMC.GPIO.PUDCR.bit.P13; break;
		case E_DD_PMC_GPIO_P14: *control = IO_PMC.GPIO.PUDCR.bit.P14; break;
		case E_DD_PMC_GPIO_P15: *control = IO_PMC.GPIO.PUDCR.bit.P15; break;
		case E_DD_PMC_GPIO_P16: *control = IO_PMC.GPIO.PUDCR.bit.P16; break;
		case E_DD_PMC_GPIO_P17: *control = IO_PMC.GPIO.PUDCR.bit.P17; break;
		case E_DD_PMC_GPIO_P20: *control = IO_PMC.GPIO.PUDCR.bit.P20; break;
		case E_DD_PMC_GPIO_P21: *control = IO_PMC.GPIO.PUDCR.bit.P21; break;
		case E_DD_PMC_GPIO_P22: *control = IO_PMC.GPIO.PUDCR.bit.P22; break;
		case E_DD_PMC_GPIO_P23: *control = IO_PMC.GPIO.PUDCR.bit.P23; break;
		case E_DD_PMC_GPIO_P24: *control = IO_PMC.GPIO.PUDCR.bit.P24; break;
		case E_DD_PMC_GPIO_P25: *control = IO_PMC.GPIO.PUDCR.bit.P25; break;
		case E_DD_PMC_GPIO_P26: *control = IO_PMC.GPIO.PUDCR.bit.P26; break;
		case E_DD_PMC_GPIO_P27: *control = IO_PMC.GPIO.PUDCR.bit.P27; break;
		case E_DD_PMC_GPIO_P30: *control = IO_PMC.GPIO.PUDCR.bit.P30; break;
		case E_DD_PMC_GPIO_P31: *control = IO_PMC.GPIO.PUDCR.bit.P31; break;
		case E_DD_PMC_GPIO_P32: *control = IO_PMC.GPIO.PUDCR.bit.P32; break;
		case E_DD_PMC_GPIO_P33: *control = IO_PMC.GPIO.PUDCR.bit.P33; break;
		case E_DD_PMC_GPIO_P34: *control = IO_PMC.GPIO.PUDCR.bit.P34; break;
		case E_DD_PMC_GPIO_P35: *control = IO_PMC.GPIO.PUDCR.bit.P35; break;
		case E_DD_PMC_GPIO_P36: *control = IO_PMC.GPIO.PUDCR.bit.P36; break;
		case E_DD_PMC_GPIO_P37: *control = IO_PMC.GPIO.PUDCR.bit.P37; break;
		case E_DD_PMC_GPIO_P44: *control = IO_PMC.GPIO.PUDCR.bit.P44; break;
		case E_DD_PMC_GPIO_P45: *control = IO_PMC.GPIO.PUDCR.bit.P45; break;
		case E_DD_PMC_GPIO_P46: *control = IO_PMC.GPIO.PUDCR.bit.P46; break;
		default:
			Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();
			Ddim_Print(("Dd_PMC_GPIO_Get_Gpio_Pull_Up_Down_Ctrl() error. port not exist.\n"));
			return D_DD_PMC_GPIO_INPUT_PARAM_ERROR;
	}

	Dd_PMC_GPIO_Stop_GPIO_CLK_WITH_EI();

	return D_DDIM_OK;
}

